﻿#ifndef PST_DIALOGDATAIMPORTCONFIGURATION_H
#define PST_DIALOGDATAIMPORTCONFIGURATION_H

#include <IdaDialogFrame>

#include <QRegularExpression>
#include <set>

#include "parser/JsonParser.h"

QT_BEGIN_NAMESPACE
namespace Ui
{
    class DialogDataImportConfiguration;
};
QT_END_NAMESPACE

namespace pst
{
    int GetResultParaType(const QString& category);

    class DialogDataImportConfiguration : public IdaDialogFrame
    {
        Q_OBJECT

    public:
        enum DataType
        {
            None,
            Key,
            Value
        };

        struct DataProperty
        {
            int index = 0;
            DataType type = None;
            QString name;
            QString category;
            QString unit;
            QString dependentVariable;
            QString dependentVariableType;
            bool isAssociation = false;
            int skipColumns = 1;
            bool isDB = false;
            int associationColumn = -1;
        };

        DialogDataImportConfiguration(const QString& fileName, QWidget* parent = nullptr);
        ~DialogDataImportConfiguration();

        void initWidget();

    private slots:
        void reject() override;
        void accept() override;
        void updateSizes(int index); // 用于调整切换页的布局大小

        // page1
        void on_radioButton_Tab_clicked();                    // “Tab”按钮被点击
        void on_radioButton_Space_clicked();                  // “空格”按钮被点击
        void on_radioButton_Comma_clicked();                  // “逗号”按钮被点击
        void on_radioButton_Other_clicked();                  // “其他”按钮被点击
        void on_spinBox_DataStartRow_valueChanged(int arg1);  // 数据起始行数值框数据变化
        void on_spinBox_ReadLines_valueChanged(int arg1);     // 读取行数值框数据变化
        void on_checkBox_ReadLines_stateChanged(int arg1);    // 读取行数勾选框状态变化
        void on_checkBox_IncludeTitle_stateChanged(int arg1); // 是否包含标题勾选框状态变化

        /// @brief page 2
        void on_radioButton_NoStats_clicked();                                         // 无属性按钮点击
        void on_radioButton_VariableSetting_clicked();                                 // 变量设置单选框点击
        void on_radioButton_DependentVariableSetting_clicked();                        // 因变量设置单选框点击
        void on_lineEdit_VariableName_returnPressed();                                 // 变量名文本框数据变化
        void on_comboBox_VariableCategory_currentIndexChanged(int index);              // 变量类别下拉框数据变化
        void on_comboBox_VariableCategoryUnit_currentIndexChanged(int index);          // 变量类别单位下拉框数据变化
        void on_lineEdit_DependentVariableName_returnPressed();                        // 因变量名文本框数据变化
        void on_comboBox_DependentVariable_currentIndexChanged(int index);             // 因变量下拉框数据变化
        void on_comboBox_DependentVariableCategory_currentIndexChanged(int index);     // 因变量类别下拉框数据变化
        void on_comboBox_DependentVariableCategoryUnit_currentIndexChanged(int index); // 因变量类别单位下拉框数据变化
        void on_checkBox_Relevance_stateChanged(int arg1);                             // 跳过特定列数后关联勾选框状态变化
        void on_lineEdit_Relevance_returnPressed();                                    // 跳过特定列数后关联文本框数据变化
        void on_checkBox_dB_stateChanged(int arg1);                                    // 是否取对数勾选框状态变化

        /// @brief page3
        void on_checkBox_2DGraph_stateChanged(int arg1);       // 二维折线图勾选框状态变化
        void on_checkBox_PolarGraph_stateChanged(int arg1);    // 极坐标图勾选框状态变化
        void on_checkBox_TwoDHeatMap_stateChanged(int arg1);   // 二维热力图勾选框状态变化
        void on_checkBox_3DSurfacePlot_stateChanged(int arg1); // 三维曲面图勾选框状态变化
        void on_checkBox_3DCloudMap_stateChanged(int arg1);    // 三维云图勾选框状态变化
        void on_checkBox_Table_stateChanged(int arg1);         // 表格勾选框状态变化

        /// @brief 底部按钮
        void on_pushButton_NextStep_clicked();
        void on_pushButton_LastStep_clicked();
        void on_pushButton_Finish_clicked();
        void on_pushButton_Reject_clicked();

        void slot_TableSelectChange();

    private:
        void ReadText(const QString& fileName);
        void initConnects();
        void ParserData();
        void ProhibitAttributeSettings();
        void ChangeKeyState(bool keyState);
        void ChangeValueState(bool valueState);
        void RestoreDefaultKeyShow();
        void RestoreDefaultValueShow();
        void RestoreNoneProperty(DataProperty& noneProperty);
        void GetKeyProperty(const DataProperty& keyProperty);
        void SetKeyProperty(DataProperty& keyProperty);
        void GetValueProperty(const DataProperty& valueProperty);
        void SetValueProperty(DataProperty& valueProperty, bool shouldChanegName = true);
        void RestoreAssociationValueProperty(const DataProperty& valueProperty);
        void SetAssociationValueProperty(DataProperty& valueProperty);
        void UpdateDataShow();
        void GetStartLine();

        Ui::DialogDataImportConfiguration* ui;
        QWidget* m_widget_page0;
        QWidget* m_widget_page1;
        QWidget* m_widget_page2;
        int m_DataRowMax;
        QString m_filePath;
        QList<QString> m_VariableCategoryData{};                             // 变量类别数据：类别
        QList<QPair<QString, QList<QString>>> m_VariableCategoryTotalData{}; // 变量类别所有数据：类别+单位List（一个类别对应多个单位）

        QList<QString> m_DependentVariableData{};                                    // 因变量数据：因变量数据
        QList<QString> m_DependentVariableCategoryData1{};                           // 因变量类别数据：因变量（标量）类别数据
        QList<QString> m_DependentVariableCategoryData2{};                           // 因变量类别数据：因变量（实部+虚部）/（幅度+相位）类别数据
        QList<QPair<QString, QList<QString>>> m_DependentVariableCategoryUnitData{}; // 因变量类别数据：因变量类别对应的单位数据

        QStringList m_text;
        QList<QVector<QPair<bool, QString>>> m_data;
        QRegularExpression m_splitReg;
        QVector<DataProperty> m_dataProperty;
        std::set<int> m_selectColumnSet;
        QStringList m_headerTextList;
    };
} // namespace pst
#endif // PST_DIALOGDATAIMPORTCONFIGURATION_H
